package org.ns.summer;

import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.ExecutorType;
import org.ns.summer.beans.AnnotationApplicationContext;
import org.ns.summer.beans.ApplicationContext;
import org.ns.summer.beans.InitializingBean;
import org.ns.summer.beans.anns.Autowired;
import org.ns.summer.beans.anns.Bean;
import org.ns.summer.data.mybatis.DBSource;
import org.ns.summer.data.mybatis.MybatisTransactionManage;
import org.ns.summer.data.mybatis.Transaction;

import javax.sql.DataSource;

/**
 * 测试实例
 */
public class Demo implements InitializingBean {

    public static void main(String[] args) throws Exception{
        ApplicationContext applicationContext = new AnnotationApplicationContext(Demo.class);

    }

    @Bean
    String dd() {
        return "dddd";
    }

    @Autowired // Autowired 自动注入属性
    String dd;

    @Bean
    DataSource basedb () {
        HikariDataSource dataSource = new HikariDataSource();

        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
        dataSource.setMinimumIdle(2);
        dataSource.setMaximumPoolSize(5);

        return dataSource;
    }

    @DBSource("basedb") // 注入数据源， DBSource 选择一个数据源，允许存在多数据源情况。
    TestMapper testMapper;

    void autoManageDbSource() { // 不做事务，任何调用都会自动提交
        //自动释放
        System.out.println("查询的数据是：" + testMapper.selectById(18));
        // 自动提交释放
        testMapper.insert("no-0" + System.currentTimeMillis());
    }

    @Transaction // 开启事务，发生异常自动回滚，方法结束自动提交，如果，默认单库事务，如果使用JTA数据源自动切换JTA事务
    void transactionCommit() {
        testMapper.insert("ddd" + System.currentTimeMillis());
        testMapper.insert("aaa" + System.currentTimeMillis());
    }

    // 行内事务， 只有在开启事务位置才会启用事务管理
    void inlineTransaction() {

        testMapper.insert("no-1" + System.currentTimeMillis()); // 无事务管理，自动提交

        // 开启事务管理  可选 MybatisTransactionManage.create(ExecutorType.BATCH).JTA()
        // ExecutorType.BATCH 批量SQL
        try (MybatisTransactionManage manage = MybatisTransactionManage.create(ExecutorType.BATCH)) {
            testMapper.insert("tran1-" + System.currentTimeMillis());
            testMapper.insert("tran2-" + System.currentTimeMillis());
            manage.commit().throwFailException();// 提交事务
        } // try 结束关闭事务, 发生异常不会提交


        testMapper.insert("no-2" + System.currentTimeMillis());// 无事务管理，自动提交

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Autowired: " + dd); //
        // 事务提交
        transactionCommit();
        // 自动管理
        autoManageDbSource();
        // 行内事务
        inlineTransaction();
    }
}
